package com.dc.designPattern._12_template.impl;

/**
 * Description: 模板方法模式_抽象类，表示豆浆制造流程
 *
 * 	定义了算法的骨架，具体子类需要去实现
 *
 * @author: gdc
 * @date: 2021/4/17
 * @version 1.0
 */
public abstract class SoyaMilk {

	/**
	 * 模板方法, make , 模板方法可以做成final , 不让子类去覆盖.
	 */
	final void make() {
		select();
		if(customerWantCondiments()) {
			addCondiments();
		}
		soak();
		beat();
	}

	/**
	 * step 1 选材料
	 */
	protected void select() {
		System.out.println("第一步：选择好的新鲜黄豆  ");
	}

	/**
	 * step 2 添加不同的配料， 抽象方法, 子类具体实现
	 */
	protected abstract void addCondiments();

	/**
	 * step 3 浸泡
	 */
	protected void soak() {
		System.out.println("第三步， 黄豆和配料开始浸泡， 需要3小时 ");
	}

	/**
	 * step 4 打碎
	 */
	protected void beat() {
		System.out.println("第四步：黄豆和配料放到豆浆机去打碎  ");
	}

	/**
	 * 钩子方法，决定是否需要添加配料
	 */
	protected boolean customerWantCondiments() {
		return true;
	}
}
